﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using CapaDeDatos;
using CapaDeDatos.EF;
using CapaDeDominio;

namespace CapaDePrueba
{
    [TestFixture]
    public class TestReservaDAO
    {
        private IReservaDAO reservaDAO = null;
        private IInstrumentoDAO instrumentoDAO = null;
        private IServicioDAO servicioDAO = null;
        private IClienteDAO clienteDAO = null; 
        private ISalaDAO salaDAO = null;
        private Reserva reservaACrear = null;
        Sala sala = null;


        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            clienteDAO = new ClienteDAO();
            instrumentoDAO = new InstrumentoDAO();
            servicioDAO = new ServicioDAO();
            reservaDAO = new ReservaDAO();
            salaDAO = new SalaDAO();
            
            sala = new Sala() { Nombre = "Rock 90s", Caracteristicas = "Premium", Capacidad = 7, Local = new LocalDAO().Obtener(1), Comentarios = "Zzz..." };
            salaDAO.Crear(sala);

            ICollection<Instrumento> objInstrumento = instrumentoDAO.ObtenerXCaracteristica("buen sonido");
            ICollection<Servicio> objServicio = null;
            objServicio.Add(servicioDAO.Obtener(1));

            reservaACrear = new Reserva()
            {
                Fecha_inicio = DateTime.Now,
                Hora_inicio = 12,
                Tiempo = 2,
                Estado = "A",
                Cliente = (clienteDAO.Obtener(1)),
                Sala = sala,
                InstrumentosAdicionales = objInstrumento,
                ServiciosAdicionales = objServicio
            };
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(reservaDAO);
            Assert.DoesNotThrow(delegate
            {
                reservaDAO.Crear(reservaACrear);
            }, "reserva creada");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(reservaACrear);
            // Probamos que el código generado sea mayor a 0
            Assert.Greater(reservaACrear.Codigo, 0);
        }
        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Definimos los datos para la prueba
            int codigo = reservaACrear.Codigo;
            // 3. Declaramos la entidad que contendrá el resultado
            Reserva reservaObtenido = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                reservaObtenido = reservaDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(reservaObtenido);
            Assert.AreEqual(reservaObtenido.Codigo, codigo);
        }
        [Test]
        public void Test3_ListarSalasReservadasXFechaHora()
        {
            // 1. Clase a probar: reservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Reserva> reservasEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                reservasEncontrados = reservaDAO.ListarSalasReservadasXFechaHora(new DateTime(), 10);
            }, "reserva encontrados");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(reservasEncontrados);
            // Probamos que la cantidad de locales encontrados sea 1
            Assert.AreEqual(reservasEncontrados.Count, 0, "No hay reservas en la fecha y hora solicitada");
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Reserva reservaEncontrado in reservasEncontrados)
            {
                Assert.IsNotNull(reservaEncontrado);
                Assert.IsInstanceOf(typeof(Reserva), reservaEncontrado);
            }
        }
        [Test]
        public void Test4_ListarXBusquedaReserva()
        {
            // 1. Clase a probar: reservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Reserva> reservasEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Sala salas = salaDAO.Obtener(1);

            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                reservasEncontrados = reservaDAO.ListarXBusquedaReserva(new DateTime(), salas);
            }, "error en la busqueda de reservas");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNull(reservasEncontrados, "No se encontraron reservas, error en metodo");
            // Probamos que la cantidad de locales encontrados sea 1
            Assert.AreEqual(reservasEncontrados.Count, 0, "No hay reservas registradas");
        }        
        [Test]
        public void Test5_ListarTodos()
        {
            // 1. Clase a probar: reservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Reserva> reservasEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                reservasEncontrados = reservaDAO.ListarTodos();
            }, "reserva encontrados");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(reservasEncontrados);
            // Probamos que la cantidad de locales encontrados sea 1
            Assert.AreEqual(reservasEncontrados.Count, 0, "No hay reservas registradas");
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Reserva reservaEncontrado in reservasEncontrados)
            {
                Assert.IsNotNull(reservaEncontrado);
                Assert.IsInstanceOf(typeof(Reserva), reservaEncontrado);
            }
        }
    }
}
